1 module hip.api.data.ini;
2 
3 
4 struct IniVar
5 {
6     string name;
7     string value;
8 
9     pragma(inline, true) string get() => value;
10     pragma(inline, true) string opAssign(string v) () => value = v;
11 
12     version(Have_util)
13     {
14         import hip.util.sumtype;
15         private Sumtype data;
16         IniVar opAssign(IniVar var){this.name = var.name; this.value = var.value; this.data = var.data; return this;}
17 
18         T get(T)()
19         {
20             static if(is(T == string))
21                 return get;
22             else
23             {
24                 if(data.type == Type.undefined)
25                     data = Sumtype.make!T(value);
26                 return data.get!T;
27             }
28         }
29         pragma(inline, true) auto opAssign(T)(T v) => data.set!T(v);
30     }
31     string toString() const @safe pure nothrow{return name~" = "~ value;}
32 }
33 
34 struct IniBlock
35 {
36     string name;
37     string comment;
38     IniVar[string] vars;
39 
40     string toString() const @safe pure
41     {
42         string ret = "["~name~"]\n";
43         foreach (v; vars)
44             ret~= v.toString();
45         return ret;
46     }
47     pragma(inline, true) auto opDispatch(string member)() => vars[member];
48     alias vars this;
49 }
50 
51 
52 interface IHipIniFile
53 {
54     ref IniBlock[string] blocks();
55     const(string[]) getErrors() const;
56     bool noError() const;
57     version(Have_util)
58     {
59         IniVar* getIniVar(string varPath);
60         T tryGet(T)(string varPath, T defaultVal = T.init)
61         {
62             IniVar* v = getIniVar(varPath);
63             if(v is null)
64                 return defaultVal;
65             return v.get!T;
66         }
67     }
68     auto opDispatch(string member)() => blocks[member];
69 }